Java - String Pool
String Pool trong Java là gì?
String Pool (hay còn gọi là String Intern Pool) là một vùng bộ nhớ đặc biệt được JVM sử dụng để lưu trữ các chuỗi hằng số (string literals). Mục đích chính của string pool là tối ưu hóa việc sử dụng bộ nhớ bằng cách chia sẻ các đối tượng chuỗi không thay đổi (immutable). Khi bạn tạo một chuỗi theo dạng literal, ví dụ:
String s1 = "Hello";
String s2 = "Hello";
JVM sẽ lưu "Hello" vào string pool. Do đó, s1 và s2 sẽ tham chiếu đến cùng một đối tượng trong pool (tức là s1 == s2 trả về true).
Một số điểm lưu ý quan trọng:
-
Literal vs. new String():
Khi bạn tạo chuỗi bằng từ khóanew, ví dụ:String s3 = new String("Hello");Một đối tượng mới sẽ được tạo ra trên heap, ngay cả khi "Hello" đã có trong string pool. Nếu bạn muốn đưa đối tượng đó vào pool, bạn cần gọi
s3.intern(). -
Phương thức intern():
Phương thứcintern()sẽ kiểm tra trong string pool xem có chuỗi tương tự không. Nếu có, nó trả về tham chiếu đến đối tượng trong pool; nếu không, nó sẽ thêm chuỗi đó vào pool và trả về tham chiếu đến đối tượng mới. -
Vị trí lưu trữ:
Trước Java 7, string pool được lưu trong vùng PermGen. Từ Java 7 trở đi, string pool được chuyển sang heap, giúp quản lý bộ nhớ hiệu quả hơn. -
Tính bất biến của String:
Do các đối tượng String trong Java là immutable, việc chia sẻ chúng trong pool không gây ra các vấn đề về thay đổi dữ liệu, góp phần tăng cường an toàn và hiệu quả bộ nhớ.
Các tình huống phỏng vấn xoay quanh chủ đề String Pool:
-
Giải thích String Pool trong Java:
- Bạn cần mô tả khái niệm string pool, cách hoạt động và mục đích sử dụng của nó.
-
So sánh giữa khởi tạo chuỗi bằng literal và bằng
new String():- Giải thích sự khác biệt về cách khởi tạo, bộ nhớ được sử dụng, và lý do tại sao
s1 == s2có thể khác khi dùng literal và khi dùngnew.
- Giải thích sự khác biệt về cách khởi tạo, bộ nhớ được sử dụng, và lý do tại sao
-
Vai trò và cách hoạt động của phương thức
intern():- Giải thích khi nào và tại sao nên sử dụng
intern(), cũng như ảnh hưởng của nó đối với bộ nhớ.
- Giải thích khi nào và tại sao nên sử dụng
-
Tại sao String trong Java lại được thiết kế là immutable?
- Giải thích liên hệ giữa tính bất biến của String và việc sử dụng string pool.
-
Các vấn đề về hiệu năng và bộ nhớ khi làm việc với String Pool:
- Thảo luận về lợi ích của string pool trong việc tiết kiệm bộ nhớ và những hạn chế (nếu có) khi xử lý số lượng lớn chuỗi động.
-
Chuỗi được thêm vào string pool khi nào?
- Ví dụ như các chuỗi literal được thêm vào compile-time, còn các chuỗi được tạo ra tại runtime qua phép nối có thể không tự động được thêm vào pool nếu không sử dụng
intern().
- Ví dụ như các chuỗi literal được thêm vào compile-time, còn các chuỗi được tạo ra tại runtime qua phép nối có thể không tự động được thêm vào pool nếu không sử dụng
-
Ảnh hưởng của Java version đến String Pool:
- So sánh cách lưu trữ string pool giữa các phiên bản Java trước và sau Java 7 (PermGen vs Heap).
-
Ví dụ thực tiễn:
- Cho ví dụ đoạn code kiểm tra sự khác biệt giữa các đối tượng String, sử dụng
==vàequals(), từ đó dẫn dắt đến việc giải thích string pool.
- Cho ví dụ đoạn code kiểm tra sự khác biệt giữa các đối tượng String, sử dụng
Những câu hỏi và tình huống này không chỉ giúp người phỏng vấn đánh giá kiến thức cơ bản về String Pool mà còn khả năng hiểu sâu và áp dụng trong thực tế của ứng viên.